package com;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**
 * 线程同步:
 * 		当多个线程操作同一个人数据的时候保证数据的一致性线程同步主要是为了数据同步,是一种安全措施
 * 
 * 异步编程:
 * 		线程是完全独立的,谁的运行也不会影响到别人
 * 
 * 同步编程 : 
 * 		线程之间不是独立的,相互之间有影响,某些现线程必须单股完成任务以后,才能让其他线程执行
 * 
 * 同步原因 :
 * 		1.数据同步,为了数据安全
 * 		2.同步条件
 * 			1必须多线程(必须有并发性)
 * 			2多个线程有可能同时操作同一个数据的可能性
 * 			3主要是数据的更改
 * 
 * 主要使用 synchronized 修饰,该方法就不能同时被访问
 * 
 * @author lenovo
 * @date 2020年7月24日
 */
public class Thread_08_Lock {

	public static void main(String[] args) {
		Account act = new Account(3000);
		Thread t1 = new Processor9(act);
		Thread t2 = new Processor9(act);
		t1.setName("t1");
		t2.setName("t1");
		t1.start();
		t2.start();
	}

}

class Processor10 extends Thread {
	ATM atm;

	public Processor10(ATM atm) {
		this.atm = atm;
	}

	@Override
	public void run() {
		atm.withDraw(1000);
	}
}

class ATM {
	Lock lock = new ReentrantLock();

	// 取钱方法
	public void withDraw(double money) {
		System.out.println(Thread.currentThread().getName() + "进来了");
		// 2
		// 开启同步
		lock.lock();
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("---数据更改---");
		// 取消同步
		lock.unlock();
		// t1
		System.out.println(Thread.currentThread().getName() + "即将执行完成");
		for (int i = 0; i < 1000; i++) {
			System.out.println(Thread.currentThread().getName() + "-->" + i);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}